﻿using System;
using System.Collections.Generic;
using System.Linq;
using CruzDelSur.Dominio;
using NHibernate;
using NHibernate.Criterion;

namespace CruzDelSur.Persistencia
{
    public class ProyectoEspecialDAO: BaseDAO<ProyectoEspecial, string>, IProyectoEspecialDAO
    {
        #region IProyectoEspecialDAO Members

        public ProyectoEspecial obtenerProyectoEspecialDetalle(string codigo)
        {
            ProyectoEspecial proyEsp = this.Obtener(codigo);
            proyEsp.Detalle = this.obtenerDetalle(proyEsp);
            return proyEsp;
        }

        public IList<ProyectoEspecialDetalle> obtenerDetalle(ProyectoEspecial cabecera)
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                IList<ProyectoEspecialDetalle> result = sesion.CreateQuery("from ProyectoEspecialDetalle where Codigo=:codigo")
                .SetString("codigo", cabecera.Codigo)
                .List<ProyectoEspecialDetalle>();
                if (result == null)
                {
                    return new List<ProyectoEspecialDetalle>();
                }
                else
                {
                    return result;
                }

            }
        }

        public void guardarDetalle(ProyectoEspecial cabecera)
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                using (ITransaction transaccion = sesion.BeginTransaction())
                {
                    sesion.CreateQuery("delete from ProyectoEspecialDetalle where Codigo=:codigo")
                    .SetString("codigo", cabecera.Codigo)
                    .ExecuteUpdate();
                    foreach (ProyectoEspecialDetalle item in cabecera.Detalle)
                    {
                        item.Codigo = cabecera.Codigo;
                        sesion.Save(item);
                    }
                    transaccion.Commit();
                }
            }
        }
        public ICollection<ProyectoEspecial> obtenerListado()
        {
            return this.Listar(DetachedCriteria.For(typeof(ProyectoEspecial)));
        }

        public ICollection<ProyectoEspecial> obtenerListadoPendientes()
        {
            ICollection<ProyectoEspecial> resultado = this.Listar(
                DetachedCriteria.For<ProyectoEspecial>().Add(
                    Restrictions.Eq("Estado", Servicio.PENDIENTE)
                   )
                );
            return resultado;
        }
        #endregion
    }
}